# coding = utf-8
# Author: 柚一
# 安装
import copy
import os
import uuid

import yaml

from core.globalContext import g_context
from util.Generatesing import generate_unique_string


# 读取yaml文件数据  经常用  后续用例yaml文件会一直使用 封装
def readYaml(filename):
    with open(filename,'r',encoding='utf-8') as f:
        data=yaml.full_load(f)
    return data

def readYamlnew(filename):
    case_infos=[]
    caseinfo=readYaml(filename)
    case_infos.append(caseinfo)
    return case_infos

# 读取context.yaml文件的数据函数
def load_context_form_yaml(folder_path):
    try:
        # yaml_file_path=r'E:\hcVip\info\hc_vip_project\day15\examples\yaml_testcase\context.yaml'
        yaml_file_path=os.path.join(folder_path,'context.yaml')
        data=readYaml(yaml_file_path)
        print(data)
        # 读取到的数据设置到全局变量中去  下个接口是不是可以直接
        g_context().set_by_dict(data)
        print("将url增加到了全局变量中去了",g_context().show_dict())
        g_context().set_dict("account",generate_unique_string())

    except Exception as e:
        print("加载yaml文件失败",e)

# 执行多个yaml文件/还需要多个yaml文件按照我的规则运行
# 规则，必须以.yaml结尾，第一个是数字用_分割
# 目录

# 目的：yaml规则按照我们的想法去运行所有的yaml用例
# 多个yaml文件数据挨个读取出来放在列表中去
def load_yaml_files(folder_path):
    yaml_caseinfos=[]
    file_names=[]
    load_context_form_yaml(folder_path)
    # 拿到目录中的所有文件和子文件
    allfiles=os.listdir(folder_path)
    for f in allfiles:
        # 规则，必须以.yaml结尾，第一个是数字用_分割
        if f.endswith(".yaml") and f.split("_")[0].isdigit():
            # 123_login.yaml
            file_number=int(f.split("_")[0])
            file_names.append((file_number,f))#[(1,2_login_ddt_yaml.yaml),(2,3_addcard_yaml.yaml)]
    file_names.sort()
    file_names=[f[1] for f in file_names]#[2_login_ddt_yaml.yaml,3_addcard_yaml.yaml]

    # 读取每个文件的用例数据
    for file_name in file_names:
        # 拼接yaml文件数据
        file_path=os.path.join(folder_path,file_name)
        # 读取yaml数据
        caseinfo=readYaml(file_path)
        print("读取每个yaml文件数据",caseinfo)
        # 把数据放在列表中
        yaml_caseinfos.append(caseinfo)
    return yaml_caseinfos

# 统一后续yaml/excel的数据格式
def yaml_case_parser(folder_path):
    case_infos=[]
    case_names=[]
    yaml_caseinfos=load_yaml_files(folder_path)
    for caseinfo in yaml_caseinfos:
        # 读取ddts吗  读取出来  处理  一个登陆用例一个数据  处理ddts的数据 循环数据组合新的用例
        # print("ddts数据存在嚒",caseinfo)
        # 先获得ddts
        ddts=caseinfo.get("ddts",[])
        if len(ddts)>0:
            caseinfo.pop("ddts")#当前的测试用例中的ddts删除掉

        if len(ddts)==0:
            case_name = caseinfo.get("desc", uuid.uuid4().__str__())
            caseinfo.update({"_case_name": case_name})
            case_infos.append(caseinfo)
            case_names.append(case_name)
        else:
            #  处理ddts的数据 循环数据组合新的用例
            for ddt in ddts:
                # 复制你当前的用例,把ddt的数据放在context里面 成为一条用例
                new_case=copy.deepcopy(caseinfo)
                context=new_case.get("context",{})
                ddt.update(context)
                new_case.update({'context':ddt})

                # 收集对应的用例标题  (登陆-正确的用户名和密码)
                case_name = f'{caseinfo.get("desc", uuid.uuid4().__str__())}-{ddt.get("desc", uuid.uuid4().__str__())}'
                new_case.update({"_case_name":case_name})

                case_infos.append(new_case)
                case_names.append(case_name)


    return {
        "case_info":case_infos,
        "case_name":case_names
    }

# 测试写的方法是不是对的
if __name__ == '__main__':
    a=yaml_case_parser(r'E:\hcVip\info\hc_vip_project\day18\examples\yaml_testcase')
    print('yaml的所有数据', a)
    # all=load_yaml_files(r'E:\hcVip\info\hc_vip_project\day15\examples\yaml_testcase')
    # print('yaml的所有数据',all)
    # load_context_form_yaml()
    # data = readYamlnew(r'/day14/examples/yaml_testcase/1_yaml_00152login.yaml')
    # print(data)

    # data=readYaml(r'E:\hcVip\info\hc_vip_project\day15_test\examples\yaml_testcase\1_yaml_00152login.yaml')
    # print(data)